home *** CD-ROM | disk | FTP | other *** search
/ Cre@te Online 2000 December / Cre@teOnline CD05.iso / MacSoft / XML ConsoleMax.sea / XML ConsoleMax / Required / swingall.jar / javax / swing / text / AbstractDocument.class (.txt) next >
Encoding:
Java Class File  |  1999-07-15  |  13.9 KB  |  544 lines

  1. package javax.swing.text;
  2.  
  3. import java.io.IOException;
  4. import java.io.ObjectInputStream;
  5. import java.io.PrintStream;
  6. import java.io.Serializable;
  7. import java.util.Dictionary;
  8. import java.util.Hashtable;
  9. import java.util.Vector;
  10. import javax.swing.event.DocumentEvent;
  11. import javax.swing.event.DocumentListener;
  12. import javax.swing.event.EventListenerList;
  13. import javax.swing.event.UndoableEditEvent;
  14. import javax.swing.event.UndoableEditListener;
  15. import javax.swing.event.DocumentEvent.EventType;
  16. import javax.swing.undo.CompoundEdit;
  17. import javax.swing.undo.UndoableEdit;
  18.  
  19. public abstract class AbstractDocument implements Document, Serializable {
  20.    private transient int numReaders;
  21.    private transient Thread currWriter;
  22.    private Dictionary documentProperties;
  23.    protected EventListenerList listenerList;
  24.    private Content data;
  25.    private AttributeContext context;
  26.    private transient BranchElement bidiRoot;
  27.    private static final String BAD_LOCK_STATE = "document lock failure";
  28.    protected static final String BAD_LOCATION = "document location failure";
  29.    public static final String ParagraphElementName = "paragraph";
  30.    public static final String ContentElementName = "content";
  31.    public static final String SectionElementName = "section";
  32.    public static final String BidiElementName = "bidi level";
  33.    public static final String ElementNameAttribute = "$ename";
  34.    static final String I18NProperty = "i18n";
  35.    static final String AsyncLoadPriority = "load priority";
  36.    // $FF: synthetic field
  37.    static Class class$javax$swing$event$DocumentListener;
  38.    // $FF: synthetic field
  39.    static Class class$javax$swing$event$UndoableEditListener;
  40.  
  41.    protected AbstractDocument(Content var1) {
  42.       this(var1, StyleContext.getDefaultStyleContext());
  43.    }
  44.  
  45.    protected AbstractDocument(Content var1, AttributeContext var2) {
  46.       this.documentProperties = null;
  47.       this.listenerList = new EventListenerList();
  48.       this.data = var1;
  49.       this.context = var2;
  50.       this.bidiRoot = new BidiRootElement(this);
  51.       this.putProperty("i18n", Boolean.FALSE);
  52.  
  53.       try {
  54.          this.writeLock();
  55.          Element[] var5 = new Element[]{new BidiElement(this, this.bidiRoot, 0, 1, 0)};
  56.          this.bidiRoot.replace(0, 0, var5);
  57.       } finally {
  58.          this.writeUnlock();
  59.       }
  60.  
  61.    }
  62.  
  63.    // $FF: synthetic method
  64.    static void access$0(AbstractDocument var0, DefaultDocumentEvent var1) {
  65.       var0.updateBidi(var1);
  66.    }
  67.  
  68.    public void addDocumentListener(DocumentListener var1) {
  69.       this.listenerList.add(class$javax$swing$event$DocumentListener != null ? class$javax$swing$event$DocumentListener : (class$javax$swing$event$DocumentListener = class$("javax.swing.event.DocumentListener")), var1);
  70.    }
  71.  
  72.    public void addUndoableEditListener(UndoableEditListener var1) {
  73.       this.listenerList.add(class$javax$swing$event$UndoableEditListener != null ? class$javax$swing$event$UndoableEditListener : (class$javax$swing$event$UndoableEditListener = class$("javax.swing.event.UndoableEditListener")), var1);
  74.    }
  75.  
  76.    private byte[] calculateBidiLevels(int var1, int var2) {
  77.       byte[] var3 = new byte[var2 - var1];
  78.       int var4 = 0;
  79.  
  80.       Element var6;
  81.       for(int var5 = var1; var5 < var2; var5 = var6.getEndOffset()) {
  82.          var6 = this.getParagraphElement(var5);
  83.          int var7 = var6.getStartOffset();
  84.          int var8 = var6.getEndOffset();
  85.  
  86.          String var9;
  87.          try {
  88.             var9 = this.getText(var7, var8 - var7);
  89.          } catch (BadLocationException var12) {
  90.             throw new Error("Internal error: " + ((Throwable)var12).toString());
  91.          }
  92.  
  93.          Bidi var10 = new Bidi(var9.toCharArray());
  94.          byte[] var11 = var10.getLevels();
  95.          System.arraycopy(var11, 0, var3, var4, var11.length);
  96.          var4 += var11.length;
  97.       }
  98.  
  99.       if (var4 != var3.length) {
  100.          throw new Error("levelsEnd assertion failed.");
  101.       } else {
  102.          return var3;
  103.       }
  104.    }
  105.  
  106.    // $FF: synthetic method
  107.    static Class class$(String var0) {
  108.       try {
  109.          return Class.forName(var0);
  110.       } catch (ClassNotFoundException var2) {
  111.          throw new NoClassDefFoundError(((Throwable)var2).getMessage());
  112.       }
  113.    }
  114.  
  115.    protected Element createBranchElement(Element var1, AttributeSet var2) {
  116.       return new BranchElement(this, var1, var2);
  117.    }
  118.  
  119.    protected Element createLeafElement(Element var1, AttributeSet var2, int var3, int var4) {
  120.       return new LeafElement(this, var1, var2, var3, var4);
  121.    }
  122.  
  123.    public synchronized Position createPosition(int var1) throws BadLocationException {
  124.       return this.data.createPosition(var1);
  125.    }
  126.  
  127.    public void dump(PrintStream var1) {
  128.       Element var2 = this.getDefaultRootElement();
  129.       if (var2 instanceof AbstractElement) {
  130.          ((AbstractElement)var2).dump(var1, 0);
  131.       }
  132.  
  133.       this.bidiRoot.dump(var1, 0);
  134.    }
  135.  
  136.    protected void fireChangedUpdate(DocumentEvent var1) {
  137.       Object[] var2 = this.listenerList.getListenerList();
  138.  
  139.       for(int var3 = var2.length - 2; var3 >= 0; var3 -= 2) {
  140.          if (var2[var3] == (class$javax$swing$event$DocumentListener != null ? class$javax$swing$event$DocumentListener : (class$javax$swing$event$DocumentListener = class$("javax.swing.event.DocumentListener")))) {
  141.             ((DocumentListener)var2[var3 + 1]).changedUpdate(var1);
  142.          }
  143.       }
  144.  
  145.    }
  146.  
  147.    protected void fireInsertUpdate(DocumentEvent var1) {
  148.       Object[] var2 = this.listenerList.getListenerList();
  149.  
  150.       for(int var3 = var2.length - 2; var3 >= 0; var3 -= 2) {
  151.          if (var2[var3] == (class$javax$swing$event$DocumentListener != null ? class$javax$swing$event$DocumentListener : (class$javax$swing$event$DocumentListener = class$("javax.swing.event.DocumentListener")))) {
  152.             ((DocumentListener)var2[var3 + 1]).insertUpdate(var1);
  153.          }
  154.       }
  155.  
  156.    }
  157.  
  158.    protected void fireRemoveUpdate(DocumentEvent var1) {
  159.       Object[] var2 = this.listenerList.getListenerList();
  160.  
  161.       for(int var3 = var2.length - 2; var3 >= 0; var3 -= 2) {
  162.          if (var2[var3] == (class$javax$swing$event$DocumentListener != null ? class$javax$swing$event$DocumentListener : (class$javax$swing$event$DocumentListener = class$("javax.swing.event.DocumentListener")))) {
  163.             ((DocumentListener)var2[var3 + 1]).removeUpdate(var1);
  164.          }
  165.       }
  166.  
  167.    }
  168.  
  169.    protected void fireUndoableEditUpdate(UndoableEditEvent var1) {
  170.       Object[] var2 = this.listenerList.getListenerList();
  171.  
  172.       for(int var3 = var2.length - 2; var3 >= 0; var3 -= 2) {
  173.          if (var2[var3] == (class$javax$swing$event$UndoableEditListener != null ? class$javax$swing$event$UndoableEditListener : (class$javax$swing$event$UndoableEditListener = class$("javax.swing.event.UndoableEditListener")))) {
  174.             ((UndoableEditListener)var2[var3 + 1]).undoableEditHappened(var1);
  175.          }
  176.       }
  177.  
  178.    }
  179.  
  180.    public int getAsynchronousLoadPriority() {
  181.       Integer var1 = (Integer)this.getProperty("load priority");
  182.       return var1 != null ? var1 : -1;
  183.    }
  184.  
  185.    protected final AttributeContext getAttributeContext() {
  186.       return this.context;
  187.    }
  188.  
  189.    public Element getBidiRootElement() {
  190.       return this.bidiRoot;
  191.    }
  192.  
  193.    protected final Content getContent() {
  194.       return this.data;
  195.    }
  196.  
  197.    protected final synchronized Thread getCurrentWriter() {
  198.       return this.currWriter;
  199.    }
  200.  
  201.    public abstract Element getDefaultRootElement();
  202.  
  203.    public Dictionary getDocumentProperties() {
  204.       if (this.documentProperties == null) {
  205.          this.documentProperties = new Hashtable(2);
  206.       }
  207.  
  208.       return this.documentProperties;
  209.    }
  210.  
  211.    public final Position getEndPosition() {
  212.       Position var1;
  213.       try {
  214.          var1 = this.createPosition(this.data.length());
  215.       } catch (BadLocationException var2) {
  216.          var1 = null;
  217.       }
  218.  
  219.       return var1;
  220.    }
  221.  
  222.    public int getLength() {
  223.       return this.data.length() - 1;
  224.    }
  225.  
  226.    public abstract Element getParagraphElement(int var1);
  227.  
  228.    public final Object getProperty(Object var1) {
  229.       return this.getDocumentProperties().get(var1);
  230.    }
  231.  
  232.    public Element[] getRootElements() {
  233.       Element[] var1 = new Element[]{this.getDefaultRootElement(), this.getBidiRootElement()};
  234.       return var1;
  235.    }
  236.  
  237.    public final Position getStartPosition() {
  238.       Position var1;
  239.       try {
  240.          var1 = this.createPosition(0);
  241.       } catch (BadLocationException var2) {
  242.          var1 = null;
  243.       }
  244.  
  245.       return var1;
  246.    }
  247.  
  248.    public String getText(int var1, int var2) throws BadLocationException {
  249.       String var3 = this.data.getString(var1, var2);
  250.       return var3;
  251.    }
  252.  
  253.    public void getText(int var1, int var2, Segment var3) throws BadLocationException {
  254.       this.data.getChars(var1, var2, var3);
  255.    }
  256.  
  257.    public void insertString(int var1, String var2, AttributeSet var3) throws BadLocationException {
  258.       if (var2 != null && var2.length() != 0) {
  259.          try {
  260.             this.writeLock();
  261.             UndoableEdit var6 = this.data.insertString(var1, var2);
  262.             DefaultDocumentEvent var7 = new DefaultDocumentEvent(this, var1, var2.length(), EventType.INSERT);
  263.             if (var6 != null) {
  264.                var7.addEdit(var6);
  265.             }
  266.  
  267.             this.insertUpdate(var7, var3);
  268.             ((CompoundEdit)var7).end();
  269.             this.fireInsertUpdate(var7);
  270.             if (var6 != null && (var3 == null || !var3.isDefined(StyleConstants.ComposedTextAttribute))) {
  271.                this.fireUndoableEditUpdate(new UndoableEditEvent(this, var7));
  272.             }
  273.          } finally {
  274.             this.writeUnlock();
  275.          }
  276.  
  277.       }
  278.    }
  279.  
  280.    protected void insertUpdate(DefaultDocumentEvent var1, AttributeSet var2) {
  281.       if (this.getProperty("i18n").equals(Boolean.TRUE)) {
  282.          this.updateBidi(var1);
  283.       }
  284.  
  285.    }
  286.  
  287.    boolean isLeftToRight(int var1, int var2) {
  288.       Element var3 = this.getBidiRootElement();
  289.       int var4 = var3.getElementIndex(var1);
  290.       Element var5 = var3.getElement(var4);
  291.       if (var5.getEndOffset() >= var2) {
  292.          AttributeSet var6 = var5.getAttributes();
  293.          return StyleConstants.getBidiLevel(var6) % 2 == 0;
  294.       } else {
  295.          return true;
  296.       }
  297.    }
  298.  
  299.    protected void postRemoveUpdate(DefaultDocumentEvent var1) {
  300.       if (this.getProperty("i18n").equals(Boolean.TRUE)) {
  301.          this.updateBidi(var1);
  302.       }
  303.  
  304.    }
  305.  
  306.    public final void putProperty(Object var1, Object var2) {
  307.       if (var2 != null) {
  308.          this.getDocumentProperties().put(var1, var2);
  309.       } else {
  310.          this.getDocumentProperties().remove(var1);
  311.       }
  312.  
  313.    }
  314.  
  315.    public final synchronized void readLock() {
  316.       try {
  317.          while(true) {
  318.             if (this.currWriter != null) {
  319.                if (this.currWriter == Thread.currentThread()) {
  320.                   return;
  321.                }
  322.  
  323.                this.wait();
  324.             } else {
  325.                ++this.numReaders;
  326.                break;
  327.             }
  328.          }
  329.       } catch (InterruptedException var1) {
  330.       }
  331.  
  332.    }
  333.  
  334.    private void readObject(ObjectInputStream var1) throws ClassNotFoundException, IOException {
  335.       var1.defaultReadObject();
  336.       this.listenerList = new EventListenerList();
  337.       this.bidiRoot = new BidiRootElement(this);
  338.  
  339.       try {
  340.          this.writeLock();
  341.          Element[] var4 = new Element[]{new BidiElement(this, this.bidiRoot, 0, 1, 0)};
  342.          this.bidiRoot.replace(0, 0, var4);
  343.       } finally {
  344.          this.writeUnlock();
  345.       }
  346.  
  347.       var1.registerValidation(new 1(this), 0);
  348.    }
  349.  
  350.    public final synchronized void readUnlock() {
  351.       if (this.currWriter != Thread.currentThread()) {
  352.          if (this.numReaders <= 0) {
  353.             throw new StateInvariantError("document lock failure");
  354.          } else {
  355.             --this.numReaders;
  356.             this.notify();
  357.          }
  358.       }
  359.    }
  360.  
  361.    public void remove(int var1, int var2) throws BadLocationException {
  362.       if (var2 > 0) {
  363.          try {
  364.             this.writeLock();
  365.             DefaultDocumentEvent var5 = new DefaultDocumentEvent(this, var1, var2, EventType.REMOVE);
  366.             boolean var6 = false;
  367.             if (Utilities.is1dot2) {
  368.                Element var7;
  369.                for(var7 = this.getDefaultRootElement(); !var7.isLeaf(); var7 = var7.getElement(var7.getElementIndex(var1))) {
  370.                }
  371.  
  372.                var6 = Utilities.isComposedTextElement(var7);
  373.             }
  374.  
  375.             this.removeUpdate(var5);
  376.             UndoableEdit var10 = this.data.remove(var1, var2);
  377.             if (var10 != null) {
  378.                var5.addEdit(var10);
  379.             }
  380.  
  381.             this.postRemoveUpdate(var5);
  382.             ((CompoundEdit)var5).end();
  383.             this.fireRemoveUpdate(var5);
  384.             if (var10 != null && !var6) {
  385.                this.fireUndoableEditUpdate(new UndoableEditEvent(this, var5));
  386.             }
  387.          } finally {
  388.             this.writeUnlock();
  389.          }
  390.       }
  391.  
  392.    }
  393.  
  394.    public void removeDocumentListener(DocumentListener var1) {
  395.       this.listenerList.remove(class$javax$swing$event$DocumentListener != null ? class$javax$swing$event$DocumentListener : (class$javax$swing$event$DocumentListener = class$("javax.swing.event.DocumentListener")), var1);
  396.    }
  397.  
  398.    public void removeUndoableEditListener(UndoableEditListener var1) {
  399.       this.listenerList.remove(class$javax$swing$event$UndoableEditListener != null ? class$javax$swing$event$UndoableEditListener : (class$javax$swing$event$UndoableEditListener = class$("javax.swing.event.UndoableEditListener")), var1);
  400.    }
  401.  
  402.    protected void removeUpdate(DefaultDocumentEvent var1) {
  403.    }
  404.  
  405.    public void render(Runnable var1) {
  406.       try {
  407.          this.readLock();
  408.          var1.run();
  409.       } finally {
  410.          this.readUnlock();
  411.       }
  412.  
  413.    }
  414.  
  415.    public void setAsynchronousLoadPriority(int var1) {
  416.       Integer var2 = var1 >= 0 ? new Integer(var1) : null;
  417.       this.putProperty("load priority", var2);
  418.    }
  419.  
  420.    public void setDocumentProperties(Dictionary var1) {
  421.       this.documentProperties = var1;
  422.    }
  423.  
  424.    private void updateBidi(DefaultDocumentEvent var1) {
  425.       int var2;
  426.       int var3;
  427.       if (javax.swing.text.AbstractDocument.DefaultDocumentEvent.access$0(var1) == EventType.INSERT) {
  428.          int var4 = var1.getOffset();
  429.          int var5 = var4 + var1.getLength();
  430.          var2 = this.getParagraphElement(var4).getStartOffset();
  431.          var3 = this.getParagraphElement(var5).getEndOffset();
  432.       } else {
  433.          if (javax.swing.text.AbstractDocument.DefaultDocumentEvent.access$0(var1) != EventType.REMOVE) {
  434.             throw new Error("Internal error: unknown event type.");
  435.          }
  436.  
  437.          Element var18 = this.getParagraphElement(var1.getOffset());
  438.          var2 = var18.getStartOffset();
  439.          var3 = var18.getEndOffset();
  440.       }
  441.  
  442.       byte[] var19 = this.calculateBidiLevels(var2, var3);
  443.       Vector var20 = new Vector();
  444.       int var6 = var2;
  445.       int var7 = 0;
  446.       if (var2 > 0) {
  447.          int var8 = this.bidiRoot.getElementIndex(var2 - 1);
  448.          var7 = var8;
  449.          Element var9 = this.bidiRoot.getElement(var8);
  450.          int var10 = StyleConstants.getBidiLevel(var9.getAttributes());
  451.          if (var10 == var19[0]) {
  452.             var6 = var9.getStartOffset();
  453.          } else if (var9.getEndOffset() > var2) {
  454.             var20.addElement(new BidiElement(this, this.bidiRoot, var9.getStartOffset(), var2, var10));
  455.          } else {
  456.             var7 = var8 + 1;
  457.          }
  458.       }
  459.  
  460.       int var21;
  461.       for(var21 = 0; var21 < var19.length && var19[var21] == var19[0]; ++var21) {
  462.       }
  463.  
  464.       int var22 = var3;
  465.       BidiElement var23 = null;
  466.       int var11 = this.bidiRoot.getElementCount() - 1;
  467.       if (var3 <= this.getLength()) {
  468.          int var12 = this.bidiRoot.getElementIndex(var3);
  469.          var11 = var12;
  470.          Element var13 = this.bidiRoot.getElement(var12);
  471.          int var14 = StyleConstants.getBidiLevel(var13.getAttributes());
  472.          if (var14 == var19[var19.length - 1]) {
  473.             var22 = var13.getEndOffset();
  474.          } else if (var13.getStartOffset() < var3) {
  475.             var23 = new BidiElement(this, this.bidiRoot, var3, var13.getEndOffset(), var14);
  476.          } else {
  477.             var11 = var12 - 1;
  478.          }
  479.       }
  480.  
  481.       int var24;
  482.       for(var24 = var19.length; var24 > var21 && var19[var24 - 1] == var19[var19.length - 1]; --var24) {
  483.       }
  484.  
  485.       if (var21 == var24 && var19[0] == var19[var19.length - 1]) {
  486.          var20.addElement(new BidiElement(this, this.bidiRoot, var6, var22, var19[0]));
  487.       } else {
  488.          var20.addElement(new BidiElement(this, this.bidiRoot, var6, var21 + var2, var19[0]));
  489.  
  490.          int var27;
  491.          for(int var25 = var21; var25 < var24; var25 = var27) {
  492.             for(var27 = var25; var27 < var19.length && var19[var27] == var19[var25]; ++var27) {
  493.             }
  494.  
  495.             var20.addElement(new BidiElement(this, this.bidiRoot, var2 + var25, var2 + var27, var19[var25]));
  496.          }
  497.  
  498.          var20.addElement(new BidiElement(this, this.bidiRoot, var24 + var2, var22, var19[var19.length - 1]));
  499.       }
  500.  
  501.       if (var23 != null) {
  502.          var20.addElement(var23);
  503.       }
  504.  
  505.       int var26 = 0;
  506.       if (this.bidiRoot.getElementCount() > 0) {
  507.          var26 = var11 - var7 + 1;
  508.       }
  509.  
  510.       Element[] var28 = new Element[var26];
  511.  
  512.       for(int var15 = 0; var15 < var26; ++var15) {
  513.          var28[var15] = this.bidiRoot.getElement(var7 + var15);
  514.       }
  515.  
  516.       Element[] var16 = new Element[var20.size()];
  517.       var20.copyInto(var16);
  518.       ElementEdit var17 = new ElementEdit(this.bidiRoot, var7, var28, var16);
  519.       var1.addEdit(var17);
  520.       this.bidiRoot.replace(var7, var28.length, var16);
  521.    }
  522.  
  523.    protected final synchronized void writeLock() {
  524.       try {
  525.          while(this.numReaders > 0 || this.currWriter != null) {
  526.             if (Thread.currentThread() == this.currWriter) {
  527.                throw new IllegalStateException("Attempt to mutate in notification");
  528.             }
  529.  
  530.             this.wait();
  531.          }
  532.  
  533.          this.currWriter = Thread.currentThread();
  534.       } catch (InterruptedException var1) {
  535.       }
  536.  
  537.    }
  538.  
  539.    protected final synchronized void writeUnlock() {
  540.       this.currWriter = null;
  541.       this.notify();
  542.    }
  543. }
  544.